#include "ros/ros.h"
// 参数查询
//  ros::NodeHandle

//         param(键,默认值) 
//             存在，返回对应结果，否则返回默认值

//         getParam(键,存储结果的变量)
//             存在,返回 true,且将值赋值给参数2
//             若果键不存在，那么返回值为 false，且不为参数2赋值

//         getParamCached键,存储结果的变量)--提高变量获取效率
//             存在,返回 true,且将值赋值给参数2
//             若果键不存在，那么返回值为 false，且不为参数2赋值

//         getParamNames(std::vector<std::string>)
//             获取所有的键,并存储在参数 vector 中 

//         hasParam(键)
//             是否包含某个键，存在返回 true，否则返回 false

//         searchParam(参数1，参数2)
//             搜索键，参数1是被搜索的键，参数2存储搜索结果的变量

//     ros::param ----- 与 NodeHandle 类似

int main(int argc, char **argv)
{
    setlocale(LC_ALL,"");
    ros::init(argc, argv, "get_param_c");

    ros::NodeHandle nh;
    //         param(键,默认值) 
//             存在，返回对应结果，否则返回默认值
    double radius = nh.param("radius", 0.5); //如果没有默认值就为0.5
    ROS_INFO("radius = %.2f", radius);
//   getParam(键,存储结果的变量)
//   存在,返回 true,且将值赋值给参数2
//   若果键不存在，那么返回值为 false，且不为参数2赋值  
    double radius2 = 0.0;
    // bool result = nh.getParam("radius", radius2);

    //  getParamCached键,存储结果的变量)--提高变量获取效率
    //  存在,返回 true,且将值赋值给参数2
    //  若果键不存在，那么返回值为 false，且不为参数2赋值
    bool result = nh.getParamCached("radius", radius2);
    if(result)
    {
        ROS_INFO("radius2 = %.2f", radius2);
    }
    else{
        ROS_INFO("不存在");
    }

    // getParamNames(std::vector<std::string>)
    //  获取所有的键,并存储在参数 vector 中 
    std::vector<std::string> names;
    nh.getParamNames(names);
    for(auto &&name:names)
    {
        ROS_INFO("遍历到的元素: %s", name.c_str());
    }

    //  hasParam(键)
    //  是否包含某个键，存在返回 true，否则返回 false
    bool flag1 = nh.hasParam("radius");
    bool flag2 = nh.hasParam("xx");
    ROS_INFO("radius 存在吗？ %d", flag1);
    ROS_INFO("xx 存在吗？ %d", flag2);

    //  searchParam(参数1，参数2)
    //  搜索键，参数1是被搜索的键，参数2存储搜索结果的变量
    std::string key;
    nh.searchParam("radius", key);
    ROS_INFO("搜索到的结果： %s", key.c_str());


    // ros::param

    double radius_param = ros::param::param("radius", 100.5);
    ROS_INFO("radius_param = %.2f", radius_param);

    std::vector<std::string> names_param;
    ros::param::getParamNames(names_param);
    for (auto &&name:names_param)
    {
        ROS_INFO("%s", name.c_str());
    }
}